# 发布和调用 WorkItem API 服务

使用 AI Studio SDK 管理一个指定 WorkItem 节点和版本的 API 服务。服务的发布、启用、调用和停用都使用同一节点 ID 与版本。

(sdk-ai-studio-workitem-api-service-flow)=
## 任务流程

先用节点 ID 和版本绑定服务，再提交发布配置并读取服务信息。启用后可发起调用；调用结果包含状态、结果或错误信息。停止接受调用时，停用服务并重新读取服务信息确认状态。

(sdk-ai-studio-workitem-api-service-prepare)=
## 准备

| 需要的内容 | 如何取得 | 在本页中的作用 |
| --- | --- | --- |
| 已认证的客户端和工作区 ID | 在首次接入流程中创建或选择。 | 确定资源访问和发布范围。 |
| WorkItem 节点 ID 和版本 | 从已确认的 WorkItem 资源结果取得。 | 选择要管理的服务版本。 |
| 发布配置 | 由服务负责人确定版本，必要时提供计算资源、超时、并发和限流设置。 | 发布或更新服务。 |
| 调用信息 | 由服务定义提供服务名、类型、版本和负载。 | 发起一次服务调用。 |

(sdk-ai-studio-workitem-api-service-publish)=
## 发布并启用服务

下面的示例发布服务并启用它。发布和启用都返回服务信息；在把服务用于业务调用前，读取返回信息或执行应用自己的可用性检查。

:::::{tab-set}
:sync-group: sdk-language

::::{tab-item} Python
:sync: python

```python
import os

import moi_product_sdk as sdk

client = sdk.new_with_personal_access_token(
    os.environ["PRODUCT_API_BASE_URL"],
    os.environ["PRODUCT_API_KEY"],
)
workspace = client.workspace("<workspace-id>")
service = workspace.workitem_api_service("<node-id>", "<version>")
published = service.publish(
    sdk.WorkitemAPIServicePublishSpec(
        version="<version>",
        compute_resource_id="<compute-resource-id>",
        timeout_seconds=30,
        max_concurrency=1,
        rate_limit_per_min=60,
    )
)
enabled = service.enable()

print(published.service.status)
print(enabled.service.status)
```

::::

::::{tab-item} Go
:sync: go

```go
package main

import (
	"context"
	"fmt"
	"os"

	sdk "github.com/matrixorigin/matrixflow/sdk/go-sdk"
)

func main() {
	ctx := context.Background()
	client, err := sdk.NewWithPersonalAccessToken(
		os.Getenv("PRODUCT_API_BASE_URL"),
		os.Getenv("PRODUCT_API_KEY"),
	)
	if err != nil {
		panic(err)
	}
	workspace, err := client.Workspace("<workspace-id>")
	if err != nil {
		panic(err)
	}
	service, err := workspace.WorkitemAPIService("<node-id>", "<version>")
	if err != nil {
		panic(err)
	}
	published, err := service.Publish(ctx, sdk.WorkitemAPIServicePublishSpec{
		Version:           "<version>",
		ComputeResourceID: "<compute-resource-id>",
		TimeoutSeconds:    30,
		MaxConcurrency:    1,
		RateLimitPerMin:   60,
	})
	if err != nil {
		panic(err)
	}
	enabled, err := service.Enable(ctx)
	if err != nil {
		panic(err)
	}

	fmt.Println(published.GetService().GetStatus())
	fmt.Println(enabled.GetService().GetStatus())
}
```

::::

:::::

(sdk-ai-studio-workitem-api-service-invoke)=
## 调用服务

继续使用同一服务引用，提供服务名、类型、版本和非空负载。调用响应中的状态、结果和错误信息用于判断本次业务调用的结果；请求返回不代表业务已经成功。

:::::{tab-set}
:sync-group: sdk-language

::::{tab-item} Python
:sync: python

```python
response = service.invoke(
    sdk.WorkitemAPIServiceInvokeSpec(
        "<service-name>",
        "<service-type>",
        "<version>",
        {"<input-name>": "<input-value>"},
    )
)

print(response.result.status)
print(response.result.result)
print(response.result.error)
```

::::

::::{tab-item} Go
:sync: go

```go
response, err := service.Invoke(ctx, sdk.WorkitemAPIServiceInvokeSpec{
	ServiceName: "<service-name>",
	Type:        "<service-type>",
	Version:     "<version>",
	Payload:     map[string]any{"<input-name>": "<input-value>"},
})
if err != nil {
	panic(err)
}

fmt.Println(response.GetResult().GetStatus())
fmt.Println(response.GetResult().GetResult())
fmt.Println(response.GetResult().GetError())
```

::::

:::::

(sdk-ai-studio-workitem-api-service-disable)=
## 停用服务

不再接受调用前，停用服务并读取服务信息确认当前状态。服务引用没有独立删除操作；WorkItem 本身的生命周期应按对应资源流程处理。

:::::{tab-set}
:sync-group: sdk-language

::::{tab-item} Python
:sync: python

```python
disabled = service.disable()
current = service.info()

print(disabled.service.status)
print(current.service.status)
```

::::

::::{tab-item} Go
:sync: go

```go
disabled, err := service.Disable(ctx)
if err != nil {
	panic(err)
}
current, err := service.Info(ctx)
if err != nil {
	panic(err)
}

fmt.Println(disabled.GetService().GetStatus())
fmt.Println(current.GetService().GetStatus())
```

::::

:::::

(sdk-ai-studio-workitem-api-service-next)=
## 下一步

- [运行并跟踪工作流](运行并跟踪工作流.md)
- [查看工作流产物和数据血缘](查看工作流产物和数据血缘.md)
